package com.samsung.appengine.client;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.samsung.appengine.allshared.JsonRpcClient;
import com.samsung.appengine.allshared.RemindMeProtocol;
import com.samsung.appengine.allshared.JsonRpcClient.Call;
import com.samsung.appengine.allshared.JsonRpcException;
import com.samsung.appengine.client.screens.WelcomeScreen;
import com.samsung.appengine.jsonrpc.gwt.JsonRpcGwtClient;
import com.samsung.appengine.shared.FieldVerifier;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
/**
* Entry point classes define <code>onModuleLoad()</code>.
*/
public class Remindme_appengine implements EntryPoint {
private static final int TRANSIENT_MESSAGE_HIDE_DELAY = 5000;
private final ScreenContainer mScreenContainer = new ScreenContainer();
public static RootPanel sMessagePanel = null;
public static String sLoginUrl = "";
public static final JsonRpcGwtClient sJsonRpcClient = new JsonRpcGwtClient("/remindmerpc");
public static Map<String, ModelJso.Alert> sAlerts = new HashMap<String, ModelJso.Alert>();
public static ModelJso.UserInfo sUserInfo = null;
/**
* The message displayed to the user when the server cannot be reached or
* returns an error.
*/
private static final String SERVER_ERROR = "An error occurred while "
+ "attempting to contact the server. Please check your network "
+ "connection and try again.";
/**
* Create a remote service proxy to talk to the server-side Greeting service.
*/
private final GreetingServiceAsync greetingService = GWT
.create(GreetingService.class);
/**
* This is the entry point method.
*/
public void onModuleLoad() {
showMessage("Loading...", false);
// Create login/logout links
loadData(new Runnable() {
public void run() {
hideMessage();
if (sUserInfo == null) {
RootPanel.get("screenPanel").add(new WelcomeScreen());
} else {
RootPanel.get("screenPanel").add(new WelcomeScreen());
// mScreenContainer.addScreen("home", new NotesList());
// mScreenContainer.addScreen("note", new NoteEditor());
// mScreenContainer.setDefault("home");
// mScreenContainer.install(RootPanel.get("screenPanel"));
}
}
});
}
public void loadData(final Runnable callback) {
List<Call> calls = new ArrayList<Call>();
// Get and populate login information
JSONObject userInfoParams = new JSONObject();
userInfoParams.put(RemindMeProtocol.UserInfo.ARG_LOGIN_CONTINUE,
new JSONString(Window.Location.getHref()));
final RootPanel loginPanel = RootPanel.get("loginPanel");
calls.add(new Call(RemindMeProtocol.UserInfo.METHOD, userInfoParams));
calls.add(new Call(RemindMeProtocol.AlertsList.METHOD, null));
sJsonRpcClient.callBatch(calls, new JsonRpcClient.BatchCallback() {
public void onData(Object[] data) {
// Process userInfo RPC call results
JSONObject userInfoJson = (JSONObject) data[0];
if (userInfoJson.containsKey(RemindMeProtocol.UserInfo.RET_USER)) {
Remindme_appengine.sUserInfo = (ModelJso.UserInfo) userInfoJson.get(
RemindMeProtocol.UserInfo.RET_USER).isObject().getJavaScriptObject();
InlineLabel label = new InlineLabel();
label.getElement().setId("userNameLabel");
label.setText(sUserInfo.getEmail());
loginPanel.add(label);
loginPanel.add(new InlineLabel(" | "));
Anchor anchor = new Anchor("Sign out",
userInfoJson.get(RemindMeProtocol.UserInfo.RET_LOGOUT_URL).isString()
.stringValue());
loginPanel.add(anchor);
} else {
sLoginUrl = userInfoJson.get(RemindMeProtocol.UserInfo.RET_LOGIN_URL).isString().stringValue();
Anchor anchor = new Anchor("Sign in", sLoginUrl);
loginPanel.add(anchor);
}
// Process notesList RPC call results
JSONObject notesListJson = (JSONObject) data[1];
if (notesListJson != null) {
JSONArray notesJson = notesListJson.get(RemindMeProtocol.AlertsList.RET_NOTES).isArray();
for (int i = 0; i < notesJson.size(); i++) {
ModelJso.Alert alert = (ModelJso.Alert) notesJson.get(i).isObject()
.getJavaScriptObject();
sAlerts.put(alert.getId(), alert);
}
}
callback.run();
}
public void onError(int callIndex, JsonRpcException caught) {
// Don't show an error if the notes.list call failed with 403 forbidden, since
// that's normal in the case of a user not yet logging in.
if (callIndex == 1 && caught.getHttpCode() == 403)
return;
showMessage("Error: " + caught.getMessage(), false);
}
});
}
public static void showMessage(String message, boolean isTransient) {
if (sMessagePanel == null) {
sMessagePanel = RootPanel.get("messagePanel");
}
sMessagePanel.setVisible(true);
sMessagePanel.getElement().setInnerText(message);
if (isTransient) {
new Timer() {
@Override
public void run() {
sMessagePanel.setVisible(false);
}
}.schedule(TRANSIENT_MESSAGE_HIDE_DELAY);
}
}
public static void hideMessage() {
sMessagePanel.setVisible(false);
}
}